package com.cs.beneficios.business.entity;

//import com.cs.beneficios.business.model.AtributoVO;
//import com.cs.beneficios.business.model.ProgramaVO;
import com.cs.beneficios.business.model.SedeVO;
import com.cs.beneficios.business.model.UsuarioxSedeVO;
//import com.cs.beneficios.business.model.ValorFlexibleVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;

public class SedeDAO
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;
  
  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
  
  public SedeDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
/**
   * 
   * @param codeUser code of the user at the moment connected 
   * @param codeSubpro code of the selected subprogram 
   * @param groupUserName Name of the user group
   * @param areaUser Code of the area to which the user belongs
   * @notes This method returns all the seats asociated to a subprogram
   * @author Carlos Ruiz & Daniel Monsalve 
   * @date 04/05/2007
   * @return Collection with the subprograms
   * @throws java.sql.SQLException
   */
  public Collection GetTotalSedebyUser(Long codeUser, Long codeSubpro,String groupUserName, Long areaUser) throws SQLException 
  {
    String query = "select distinct CODIGO, NOMBRE,CARACTER,DIRECCION_DESCRIPTIVA, " +
                    " DESDE_VIGENCIA,HASTA_VIGENCIA, VIGENCIA,CODNUCLEO, "+
                    " DESCNUCLEO, SEDE_CODIGO , DESCRIPCION, TIPO,DIRECCION_ENCASILLADA, "+
                    " LOCALIZACION_COBAMA,CODMUNI,DESCMUNI from VCS_BEN_SEDES ";
    if((Object)codeUser != null && !groupUserName.equalsIgnoreCase(""))
    {
    
    query +=" where (codUser = usuCodigo or 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or codUser = "+codeUser;
            if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
            {
              query += " or COD_AREA = "+areaUser;
            }
            query += " ) ";
            
    if((Object)codeSubpro !=null)
    {
    query += " and codSub = "+codeSubpro;
    }
    }


    //System.out.println(query);
    ResultSet rst = null;
    ArrayList lSede = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SedeVO sede = null;
		while ( rst.next() ) 
		{
        sede = new SedeVO();
        sede.setCode(new Long(rst.getLong("CODIGO")));
        sede.setNombre(rst.getString("NOMBRE"));
        sede.setCaracter(rst.getString("CARACTER"));
        sede.setDireccion_descriptiva(rst.getString("DIRECCION_DESCRIPTIVA"));
        sede.setDesde(rst.getString("DESDE_VIGENCIA"));
        sede.setHasta(rst.getString("HASTA_VIGENCIA"));
        sede.setVigencia(rst.getString("VIGENCIA"));
        sede.setCodeNucleo(new Long(rst.getLong("CODNUCLEO")));        
        sede.setDescNucleo(rst.getString("DESCNUCLEO"));
        sede.setCodeSubsede(new Long(rst.getLong("SEDE_CODIGO")));
        sede.setDescripcion(rst.getString("DESCRIPCION"));
        sede.setTipo(rst.getString("TIPO"));  
        sede.setDireccion_encasillada(rst.getString("DIRECCION_ENCASILLADA"));
        sede.setLocalizacion_cobama(rst.getString("LOCALIZACION_COBAMA"));
        sede.setCodeMunicipio(new Long(rst.getLong("CODMUNI")));        
        sede.setDescMunicipio(rst.getString("DESCMUNI"));
        lSede.add(sede);
        sede=null;
		}
  	rst.close();
    return lSede;
  }
  
    public Collection GetTotalSedebyUser(Long codeUser, Long codeSubpro,String groupUserName, Long areaUser, String codeSede) throws SQLException 
    {
        String query = "select distinct CODIGO, NOMBRE " +
                      " from VCS_BEN_SEDES ";
        
        if((Object)codeUser != null && !groupUserName.equalsIgnoreCase("")){
          query +=" where (codUser = usuCodigo or 'ADMINISTRADOR GENERAL' = '"+groupUserName+"' OR 'SUPER USUARIO' = '"+groupUserName+"' or codUser = "+codeUser;
                  if(groupUserName != null && groupUserName.equals("ADMINISTRADOR SECRETARIA"))
                  {
                    query += " or COD_AREA = "+areaUser;
                  }
                  query += " ) ";
              
          if((Object)codeSubpro !=null){
          query += " and codSub = "+codeSubpro;
          }
        }

        ResultSet rst = null;
        ArrayList lSede = new ArrayList();
        rst = cf.getRecordsRset(query,null,conn);
        SedeVO sede = null;
        boolean isSedeActual = false;        
        
        while ( rst.next() ) {
            sede = new SedeVO();
            sede.setCode(new Long(rst.getLong("CODIGO")));
            sede.setNombre(rst.getString("NOMBRE"));
           
            if(rst.getString("CODIGO").equals(codeSede)){
                isSedeActual = true;
            }
            
            lSede.add(sede);
            sede=null;
        }
        
        if(!isSedeActual){
            query = " SELECT CODIGO, NOMBRE" +
                    " FROM TCS_BEN_SEDE" +
                    " WHERE CODIGO ="+codeSede;
            
            ResultSet rst2 = null;
            rst2 = cf.getRecordsRset(query,null,conn);
            
            rst2.next();
            
            sede = new SedeVO();
            sede.setCode(new Long(rst2.getLong("CODIGO")));
            sede.setNombre(rst2.getString("NOMBRE"));
            
            lSede.add(sede);
            sede=null;
            rst2.close();
        }
        
        rst.close();
        return lSede;
    }
  
//  public Collection GetSede(Long codeUser, Long codeSubpro) throws SQLException 
//  {
//    String query = "select * from VCS_BEN_SEDES ";
//    
//    if((Object)codeUser != null && (Object)codeSubpro !=null)
//    {
//      query +="where codUser = "+codeUser+" and codSub = "+codeSubpro;
//    }else return null;
////    System.out.println(query);
//    ResultSet rst = null;
//    ArrayList lSede = new ArrayList();
//    rst = cf.getRecordsRset(query,null,conn);
//		SedeVO sede = null;
//		while ( rst.next() ) 
//		{
//        sede = new SedeVO();
//        sede.setCode(new Long(rst.getLong("CODIGO")));
//        sede.setCodeSede(sede.getCode());
//        sede.setNombre(rst.getString("NOMBRE"));
//        sede.setCaracter(rst.getString("CARACTER"));
//        sede.setDireccion_descriptiva(rst.getString("DIRECCION_DESCRIPTIVA"));
//        sede.setDesde(rst.getString("DESDE_VIGENCIA"));
//        sede.setHasta(rst.getString("HASTA_VIGENCIA"));
//        sede.setVigencia(rst.getString("VIGENCIA"));
//        sede.setCodeNucleo(new Long(rst.getLong("CODNUCLEO")));        
//        sede.setDescNucleo(rst.getString("DESCNUCLEO"));
//        sede.setCodeSubsede(new Long(rst.getLong("SEDE_CODIGO")));
//        sede.setDescripcion(rst.getString("DESCRIPCION"));
//        sede.setTipo(rst.getString("TIPO"));  
//        sede.setDireccion_encasillada(rst.getString("DIRECCION_ENCASILLADA"));
//        sede.setLocalizacion_cobama(rst.getString("LOCALIZACION_COBAMA"));
//        sede.setCodeMunicipio(new Long(rst.getLong("CODMUNI")));        
//        sede.setDescMunicipio(rst.getString("DESCMUNI"));
//        lSede.add(sede);
//        sede=null;
//		}
//  	rst.close();
//    return lSede;
//  }
  
  public Collection GetSede() throws SQLException 
  {
    String query = "select codigo, upper(nombre) nombre from TCS_BEN_SEDE " +
                   "where Fcs_Ben_Val_Vigencia(VIGENCIA, DESDE_VIGENCIA, HASTA_VIGENCIA, sysdate) = 'A' "+
                   " and vigencia='A' order by nombre";
    //System.out.println(query);
    ResultSet rst = null;
    ArrayList lSede = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SedeVO sede = null;
		while ( rst.next() ) 
		{
        sede = new SedeVO();
        sede.setCode(new Long(rst.getLong("CODIGO")));
        sede.setNombre(rst.getString("NOMBRE"));
        lSede.add(sede);
        sede=null;
		}
  	rst.close();
    return lSede;
  }
  
  
  public Collection TotalSedes() throws SQLException 
  {
    String query = "select codigo, upper(nombre) nombre from TCS_BEN_SEDE "+
                   " ORDER BY UPPER(NOMBRE) ";
                   
    ResultSet rst = null;
    ArrayList lSede = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
		SedeVO sede = null;
		while ( rst.next() ) 
		{
        sede = new SedeVO();
        sede.setCode(new Long(rst.getLong("CODIGO")));
        sede.setNombre(rst.getString("NOMBRE"));
        lSede.add(sede);
        sede=null;
		}
  	rst.close();
    return lSede;
  }

/**
   * Autor DORIS
   * @param codeSede
   * @return 
   * @throws java.sql.SQLException
   */
   public Collection getUsuarioxSede(UsuarioxSedeVO criterea)
   {
      String query = "SELECT usu.CODIGO codeusu, usu.NOMBRE nomusu, usu.DESCRIPCION descrip, prog.CODIGO codeprograma, "+
						 " prog.NOMBRE nomprograma, sub.CODIGO codesubprograma, sub.NOMBRE nomsubprograma, "+
						 " sede.CODIGO codesede, sede.NOMBRE nomsede, gus.descripcion descripGrupo "+
						 " FROM paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gus,TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA sub, "+
						 " TCS_BEN_SEDE sede, TCS_BEN_USUARIO_SEDE ususede, TCS_BEN_SUBPROGRAMA_SEDE subsede "+
						 " WHERE  ususede.SPSE_CODIGO = subsede.CODIGO AND subsede.SBPR_CODIGO = sub.CODIGO AND "+
						 " sub.PRG_CODIGO = prog.CODIGO AND subsede.SEDE_CODIGO = sede.CODIGO AND ususede.USU_CODIGO = usu.CODIGO "+
						 " AND usu.gus_codigo = gus.codigo AND sede.CODIGO = "+criterea.getCodeSede() ;
    
    if(criterea.getCodePrograma() != null)
      query += " AND prog.CODIGO = "+criterea.getCodePrograma();
      
    if(criterea.getCodeSubprograma() != null)
      query += " AND sub.CODIGO = "+criterea.getCodeSubprograma();
                     
    ResultSet rst = null;
    //System.out.println(query);
    ArrayList Usuarios = new ArrayList();
    try{
    rst = cf.getRecordsRset(query,null,conn);
    UsuarioxSedeVO usu = null;
   	while (rst.next()) 
      {
       usu = new UsuarioxSedeVO();
       usu.setNombreUsuario(rst.getString("nomusu"));
       usu.setCodeUsuario(new Long(rst.getString("codeusu")));
       usu.setNombrePrograma(rst.getString("nomprograma"));
       usu.setNombreSubprograma(rst.getString("nomsubprograma"));
       usu.setDescripcionUsuario(rst.getString("descrip"));
	   usu.setDescripcionGrupoUsuario(rst.getString("descripGrupo"));
       
       Usuarios.add(usu);
       usu = null;
      
      }
     rst.close();
      
    }catch(SQLException e){
		System.err.println("/******** TDSUB - cwsub");
		e.printStackTrace();
		System.err.println("TDSSPE - cwsub ********/");
    }
    
    return Usuarios;
   }
   
   
   /**
   * Autor DORIS
   * @param codeSede
   * @return 
   * @throws java.sql.SQLException
   */
   public Collection getSedes(SedeVO criterea) throws SQLException
   {
      String query = "SELECT codigo,nombre FROM TCS_BEN_SEDE ";
      //String query = " SELECT codigo,nombre FROM TCS_BEN_SEDE WHERE vigencia <> 'I' ";
      if(!criterea.getNombre().equalsIgnoreCase(""))
      {
        query += "WHERE  nombre LIKE UPPER('%"+(criterea.getNombre()).trim()+"%') ";
      }                
      ResultSet rst = null;
      ArrayList sedes = new ArrayList();
      //System.out.println(query);
      rst = cf.getRecordsRset(query,null,conn);
      SedeVO sede = null;
      while (rst.next()) 
      {
       sede = new SedeVO();
       sede.setCode(new Long(rst.getString("codigo")));
       sede.setNombre(rst.getString("nombre"));
       sedes.add(sede);
       sede = null;
      }
      rst.close();
      return sedes;
   }
   
   public String getNameByCode(String strCodeSede) throws SQLException
   {
     String query = "SELECT nombre FROM TCS_BEN_SEDE "+
                    "WHERE codigo = "+strCodeSede;
    
     String strName = null;
     ResultSet rst = null;
     rst = cf.getRecordsRset(query,null,conn);
     if(rst.next())
     {
       strName = rst.getString("nombre");
     }
     rst.close();
     return strName;
   }
   
   public Collection getSedesAsociadas(String codeSub) throws SQLException {
	   String query = "SELECT DISTINCT sede.nombre NOMBRESEDE, to_char(sede.DESDE_VIGENCIA, 'yyyy-mm-dd') DESDE, " +
					  " to_char(sede.HASTA_VIGENCIA, 'yyyy-mm-dd') HASTA, decode(sede.VIGENCIA, 'A', 'S', 'I', 'N') VIGENCIASEDE " +
					  " FROM TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA_SEDE subsede " +
					  " WHERE subsede.SBPR_CODIGO = "+codeSub+
					  " AND subsede.SEDE_CODIGO = sede.CODIGO ";
        
	   ResultSet rst = null;
	   rst = cf.getRecordsRset(query, null, conn);
	   Collection sedes = new ArrayList();
	   SedeVO sedeVO = null;

	   while(rst.next()){
		   sedeVO = new SedeVO();
		   sedeVO.setNombre(rst.getString("NOMBRESEDE"));
		   sedeVO.setDesde(rst.getString("DESDE"));
		   sedeVO.setHasta(rst.getString("HASTA"));
		   sedeVO.setVigencia(rst.getString("VIGENCIASEDE"));
            
		   sedes.add(sedeVO);
	   }
        
	   return sedes;
        
   }

 public Connection getConn()
 {
    return conn;
 }
}